#include <bits/stdc++.h>
using namespace std;

// 深信服

#if 0
int test1() {
  string str;
  cin >> str;
  vector<pair<char, int>> st;
  for (auto& i : str) {
    if (!st.empty() && st.back().first == i) {
      if (++st.back().second == 3) st.pop_back();
    } else {
      st.push_back(make_pair(i, 1));
    }
  }
  string res;
  for (auto& i : st) {
    int l = i.second;
    // 遍历有多少个相邻重复元素
    while (l--) res += i.first;
  }
  cout << res << endl;
  return 0;
}
#endif

#if 0
void backtrack(int pushIndex, int popIndex, const string& pushed,
               stack<char>& s, vector<char>& popSeq,
               vector<vector<char>>& result) {
  // 如果已经生成了完整的弹出序列，将其加入结果中
  if (popIndex == pushed.size()) {  // 弹出序列长度等于 pushed
                                    // 长度，说明已经生成了完整的弹出序列
    result.push_back(popSeq);
    return;
  }

  // 如果栈不为空，尝试弹出栈顶元素
  if (!s.empty()) {
    popSeq.push_back(s.top());
    s.pop();
    // popIndex + 1 表示当前弹出的序列长度，pushIndex 表示当前压入的元素下标
    backtrack(pushIndex, popIndex + 1, pushed, s, popSeq, result);
    s.push(popSeq.back());  // 回溯，重新压回栈
    popSeq.pop_back();      // 移除最后的弹出
  }

  // 如果还有元素可以压入栈
  if (pushIndex < pushed.size()) {
    s.push(pushed[pushIndex]);
    backtrack(pushIndex + 1, popIndex, pushed, s, popSeq, result);
    s.pop();  // 回溯，移除刚刚压入的元素
  }
}

vector<vector<char>> allPossiblePopSequences(const string& pushed) {
  vector<vector<char>> result;  // 存放所有可能的弹出序列
  stack<char> s;                // 栈，用于模拟弹出操作
  vector<char> popSeq;          // 存放当前弹出的序列

  backtrack(0, 0, pushed, s, popSeq, result);
  return result;
}

int main() {
  string pushed;
  cin >> pushed;
  vector<vector<char>> popSequences = allPossiblePopSequences(pushed);

  cout << "所有可能的弹出序列:" << endl;
  for (const auto& seq : popSequences) {
    for (char ch : seq) {
      cout << ch;
    }
    cout << endl;
  }

  return 0;
}
#endif